﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using Model;

namespace BusinessObject
{
    public class EpicBO : Repository<Epic>
    {
        #region Singleton

        private static readonly EpicBO _instance = new EpicBO();

        /// <summary>
        /// Instância do objeto singleton.
        /// </summary>
        public static EpicBO Instance
        {
            get { return _instance; }
        }

        private EpicBO() { }

        #endregion Singleton

        /// <summary>
        /// Este método faz o import de epic de acordo com o projeto passado.
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public bool Import(HttpPostedFile file, Project project)
        {
            if (!string.IsNullOrEmpty(file.FileName))
            {
                try
                {
                    //Lê o arquivo inteiro, pois se der um exception os dados restantes não seram lidos.
                    using (StreamReader sr = new StreamReader(file.InputStream))
                    {
                        String line;

                        while ((line = sr.ReadLine()) != null)
                        {
                            IList<string> lineObject;

                            Epic epic = new Epic();

                            //aqui dever ser entre plic's pois é do tipo char o separador.
                            lineObject = line.Split(';');

                            //os atributos são na ordem do template do arquivo
                            epic.Project = project;
                            epic.Nome = lineObject[0];
                            epic.Descricao = lineObject[1];
                            if (!(lineObject[2] == String.Empty))
                                epic.MelhorCaso = Double.Parse(lineObject[2]);
                            if (!(lineObject[3] == String.Empty))
                                epic.CasoMedio = Double.Parse(lineObject[3]);
                            if (!(lineObject[4] == String.Empty))
                                epic.PiorCaso = Double.Parse(lineObject[4]);

                            //grava o objeto
                            EpicBO.Instance.Save(epic);
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("O Arquivo" + file.FileName + " não pode ser lido. Erro: " + e.Message);
                }
            }

            return true;
        }

        public IList<Epic> GetEpicByProject(Project project)
        {
            return base.GetByCriteria(e => e.Project.Id == project.Id);
        }

        public IList<Epic> GetEpicByRelease(Release release)
        {
            return base.GetByCriteria(e => e.Release.Id == release.Id);
        }

        public IList<Epic> getEpicByIds(IList<int> ids)
        {
            IList<Epic> epics = new List<Epic>();
            foreach (int id in ids)
            {
                epics.Add(base.GetById(id));
            }
            return epics;
        }
    }
}